package com.example.feign.fallback.factory;

import com.example.bean.Product;
import com.example.feign.ProductService;
import com.example.shoputils.resp.Result;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

/**
 * @Author 刘武贵
 * @Date 2024-03-03 19:09
 * @Description 功能描述：商品微服务容错Factory 容错扩展
 */
@Component
/**
 * 定义一个产品服务的容错工厂类，实现FallbackFactory接口，用于在Hystrix断路器打开或服务提供者不可用时，
 * 提供一个回退方案（Fallback）。
 */
public class ProductServiceFallBackFactory implements FallbackFactory<ProductService> {

    /**
     * 根据提供的异常信息创建一个ProductService的回退实例。
     *
     * @param cause 异常对象，表示导致服务失败的原因。
     * @return 返回一个实现了ProductService接口的回退实例。
     */
    @Override
    public ProductService create(Throwable cause) {
        // 创建一个匿名内部类，实现ProductService接口，提供默认的回退逻辑
        return new ProductService() {
            /**
             * 获取产品信息的回退实现。
             *
             * @param pid 产品ID。
             * @return 返回一个设置为默认值的产品对象。
             */
            @Override
            public Product getProduct(Long pid) {
                Product product = new Product();
                // 设置一个默认的产品ID，表示未找到产品
                product.setId(-1L);
                return product;
            }

            /**
             * 更新产品库存的回退实现。
             *
             * @param pid 产品ID。
             * @param count 更新的库存数量。
             * @return 返回一个结果对象，设置特定的错误代码和信息，表示操作失败。
             */
            @Override
            public Result<Integer> updateCount(Long pid, Integer count) {
                Result<Integer> result = new Result<>();
                // 设置自定义错误代码
                result.setCode(1001);
                // 设置错误信息
                result.setCodeMsg("触发了容错逻辑");
                return result;
            }
        };
    }
}